package reflect;

import java.lang.reflect.Method;
import java.util.Scanner;

/**
 * Java反射机制:
 * 1.类对象(Class):该类的每一个实例用于表示JVM加载的一个类的信息,反射操作的第一步就是获取需要操作的类的类对象;
 * 2.Java在操作一个类时,会读取该类的字节码文件,然后实例化一个Class对象记录加载的这个类的信息;
 * 3.JVM内部每个被加载的类都有且只有一个Class的实例与之关联,这个Class实例称为类对象;
 */
public class Demo01Reflect {
    public static void main(String[] args) throws ClassNotFoundException {
        /*
            四种方式获取一个类的类对象
            1.类名.class
              Class cls = String.class;
              Class cls = int.class;
            2.对象.getClass()
              String s = "Hello";
              Class cls = s.getClass();
            3.Class cls = Class.forName("类的完全限定名"); //完全限定名:包名.类名;
              Class cls = Class.forName("java.lang.String");
              Class cls = Class.forName("reflect.Demo1Reflect");
            4.【不常用】ClassLoader.loadClass("类的完全限定名");
              Class cls = ClassLoader.getSystemClassLoader().loadClass("java.lang.String")
         */
        //获取String的类对象,用于了解String的相关信息;
        //***********获取类对象的第1种方式****************
        //Class cls = String.class;
        //Class cls = ArrayList.class;
        //Class cls = FileInputStream.class;

        //**********获取类对象的第2种方式******************
        //Class cls = Class.forName("java.lang.String");
        //Class cls = Class.forName("java.util.ArrayList");
        //Class cls = Class.forName("java.io.FileInputStream");

        //**********Scanner实现程序运行起来之后动态获取相关信息***********
        /*
            测试数据:
              1.java.lang.String
              2.java.util.ArrayList
         */
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个类的完全限定名:");
        String className = scanner.nextLine();
        Class cls = Class.forName(className);

        //1.获取该类的完全限定名:java.lang.String
        String name = cls.getName();
        //2.仅获取类名
        name = cls.getSimpleName();
        System.out.println(name);
        //3.获取包名
        /*
            Package和Class一样都是反射对象;
            只是Class的每个实例表示的是一个类的全部信息,而Package仅表示该类的包信息;
            一个是类的信息,一个是类所属的包的信息;
         */
        Package pkg = cls.getPackage();
        System.out.println(pkg.getName());

        //4.方法信息;
        Method[] methods = cls.getMethods();
        System.out.println("共有:" + methods.length + "个方法");
        for (Method m : methods) {
            System.out.println(m.getName());
        }
    }
}






